package it.controllocredito.backend.persistence;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.PhoneLookup;
import android.util.Log;
import it.controllocredito.backend.persistence.bean.RegistroChiamate;
import it.controllocredito.backend.persistence.tables.RegistroChiamateTable;
import it.controllocredito.backend.phone.calllog.ManagerCallLogHandler;

 
public class CalllogPersistenceManager 
{
	private Context context;
	private DatabaseHandler databaseHandler;
	private static final String	log_class_name	= "CallLogPersistenceManager";

	
	public CalllogPersistenceManager(Context context) 
	{
		this.context = context;
		
		databaseHandler = new DatabaseHandler(context);
	}

	public CalllogPersistenceManager(Context context,DatabaseHandler databaseHandler)
	{
		this.context = context;
		
		this.databaseHandler = databaseHandler;		
	}



	public void cleanRegistro()
	{
		databaseHandler.deleteAllRecords(RegistroChiamateTable.getName());
	}
	
	public void aggiornamentoRegistro() 
	{
		updateRegistro(null);
	}

	public void aggiornamentoRegistro(String whereCondition) 
	{
		updateRegistro(whereCondition);
	}

	private void updateRegistro(String whereCondition) 
	{

		RegistroChiamate registroChiamate;

		ManagerCallLogHandler managerCallLogHandler = new ManagerCallLogHandler(context);

		ArrayList<RegistroChiamate> listaChiamate = managerCallLogHandler
				.aggiornaRegistroChiamate(whereCondition);

		Iterator<RegistroChiamate> iteratoreChiamate = listaChiamate.iterator();
		
		while (iteratoreChiamate.hasNext()) 
		{
			registroChiamate = (RegistroChiamate) iteratoreChiamate.next();

			databaseHandler.addRecord(RegistroChiamateTable.getName(),
					RegistroChiamateTable.createRecord(
							registroChiamate.getAnno(),
							registroChiamate.getMese(),
							registroChiamate.getGiorno(),
							registroChiamate.getGiornoSettimana(),
							registroChiamate.getOra(),
							registroChiamate.getTipo(),
							registroChiamate.getDurata(), "",
							registroChiamate.getNumeroTel()));
		}

	}

	public List<RegistroChiamate> getRecordsRegistroChiamate(int block, int limit)
	{
		List<RegistroChiamate> registroChiamate = databaseHandler.getBlockRecordsRegistroChiamate(block, limit); 
		 return parseRegistroChiamate(registroChiamate);
		
	}
	
	public int getTotalRecordsRegistroChiamate()
	{
		return databaseHandler.getTotalRecordsRegistroChiamate();		
	}
	
	public int getTotalTimeOutgoingRegistroChiamate()
	{
		return databaseHandler.getTotalTimeOutgoingRegistroChiamate();		
	}
	
	public List<RegistroChiamate> getRecordsRegistroChiamate(String sqlWehereCondition)
	{			
		return databaseHandler.getRecordsRegistroChiamate(sqlWehereCondition);
	}
	
	public List<RegistroChiamate> parseRegistroChiamate(List<RegistroChiamate> registroChiamate){
		List<RegistroChiamate> result = new LinkedList<RegistroChiamate>();
		for(RegistroChiamate r: registroChiamate){
			
			RegistroChiamate temp = r;
			String numeroTel = r.getNumeroTel();
			
			Uri nameUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(numeroTel));
			Uri photoUri = null;
			Cursor contact = context.getContentResolver().query(nameUri,null,null,null,null);
			
			if (contact.moveToFirst()) {
				long userId = contact.getLong(contact.getColumnIndex(ContactsContract.Contacts._ID));
				temp.setNumeroTel(contact.getString(contact.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
				photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, userId);
				if (photoUri != null) {
			        InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), photoUri);
			        if (input != null) {
			            temp.setList_image(BitmapFactory.decodeStream(input));
			    	}
				}
			}
			
			contact.close();
			result.add(temp);
		}
		return result;
	}
	
	
}
